跳到主要内容

gRPC 的请求

trailer 和 header 的区别

在一个测试代码中看到如下的内容

client := apis.NewGreeterClient(conn)

var header, trailer metadata.MD

resp, err := client.Hello(context.TODO(), &apis.HelloRequest{
Message: "hi",
}, grpc.Header(&header), grpc.Trailer(&trailer))
if err != nil {
panic(err)
}

可以看到发送 matedata 有两种方式 一种是通过 Header,另外一种是 Trailer。

既然可以通过 Header 发送元数据,为什么还需要通过 Trailer 发送呢?这两个的区别和联系是什么呢?

首先,我们需要知道 grpc 通信模式分为四种

  1. 一元RPC模式
  2. 服务器流RPC模式
  3. 客户端流RPC模式
  4. 双向流RPC模式

看 一元RPC模式 和 双向流RPC模式 的区别

一元RPC模式通过一发一收模式

客户端消息由 头部-内容1-EOS 构成,服务端消息由 头部-内容1-trailer 构成

20220720172914

双向流RPC模式通过多发多收模式

客户端消息由 头部-内容3-内容1-内容2-EOS 构成,
服务端消息由 头部-内容1-内容2-内容3-trailer

20220720172950

可以看出,在一元模式中,header 和 trailer 是一起到达客户端的,此时客户端从 header 或者 trailer 中获取 metadata 是一样的

但是在流模式中,header 是先到达,然后接收多个 stream 内容,最后才获取到 trailer,获取的时机是不一样的,所以 grpc 提供了两种方式让我们发送 metadata

References